package modelo.bd.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Documento;
import modelo.servicio.Documentos;
import modelo.servicio.Historicos;
import modelo.servicio.Secciones;

public class DocumentoDAO { //extends AbstractDAO<Documento> {

    private String query;

    public void add(Documento entity) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            /*
             * PROCEDURE [dbo].[SSMA_ALTER_DOCUMENTO_P] @ACCION varchar(1),
             * @USUARIO varchar(25), @CLAVE_DOC varchar(22), @FOLIO varchar(4),
             * @RUTA varchar(200), @ID_SECCION int, @DESCRIPCION varchar(300),
             * @TIPO_DOC varchar(4), @LUGAR_FISICO varchar(200), @ESTADO
             * varchar(2), @PRECEDENTE VARCHAR(22)
             */
            query = "EXEC SSMA_ALTER_DOCUMENTO_P ";
            query += "'I'";
            query += ", '" + entity.getHistorico().getUsuarioCrea().replace("'", "''") + "'";
            query += ", '" + entity.getClave().replace("'", "''") + "'";
            query += ", '" + entity.getFolio().replace("'", "''") + "'";
            query += ", '" + entity.getRuta().replace("'", "''") + "'";
            query += ", " + entity.getSeccion().getIdSeccion();
            query += ", '" + entity.getDescripcion().replace("'", "''") + "'";
            query += ", '" + entity.getTipoDoc().replace("'", "''") + "'";
            query += ", '" + entity.getLugarFisico().replace("'", "''") + "'";
            query += ", 'CR'";
            query += ", " + (entity.getPrecedente() == null ? "NULL" : ("'" + entity.getPrecedente().getClave().replace("'", "''") + "'"));
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 DODA-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 DODA-SQL " + ex.getMessage());
            }
        }
    }

    public void deleteWhere(String condition) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "UPDATE SSMA_HISTORICO_T SET ESTADO = 'IN' WHERE ID_HISTORICO IN ";
            query += " (SELECT ID_HISTORICO FROM SSMA_DOCUMENTOS_T WHERE " + condition + ")";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 DODD-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 DODD-SQL " + ex.getMessage());
            }
        }
    }

    public void update(Documento entity) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            /*
             * PROCEDURE SSMA_ALTER_DOCUMENTOS_P --ARGUMENTOS POR DEFECTO
             * @ACCION VARCHAR(1), @USUARIO VARCHAR(25), --ARGUMENTOS DE LA
             * TABLA @CLAVE_DOC VARCHAR(22), @FOLIO VARCHAR(4), @RUTA
             * VARCHAR(200), @ID_SECCION INT, @ID_ESTUDIO VARCHAR(150),
             * @DESCRIPCION VARCHAR(300), @TIPO_DOC VARCHAR(4), @LUGAR_FISICO
             * VARCHAR(200), @ESTADO VARCHAR(1)
             */
            query = "EXEC SSMA_ALTER_DOCUMENTO_P ";
            query += "'U'";
            query += ", '" + entity.getHistorico().getUsuarioCrea().replace("'", "''") + "'";
            query += ", '" + entity.getClave().replace("'", "''") + "'";
            query += ", '" + entity.getFolio().replace("'", "''") + "'";
            query += ", '" + entity.getRuta().replace("'", "''") + "'";
            query += ", " + entity.getSeccion().getIdSeccion();
            query += ", '" + entity.getDescripcion().replace("'", "''") + "'";
            query += ", '" + entity.getTipoDoc().replace("'", "''") + "'";
            query += ", '" + entity.getLugarFisico().replace("'", "''") + "'";
            query += ", '" + entity.getHistorico().getEstado().replace("'", "''") + "'";
            query += ", " + (entity.getPrecedente() == null ? "NULL" : ("'" + entity.getPrecedente().getClave().replace("'", "''") + "'"));
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("1 DODU-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 DODU-SQL " + ex.getMessage());
            }
        }
    }

    protected synchronized List<Documento> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Documento> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Documento>();
            while (resultado.next()) {
                Documento doc = new Documento();
                doc.setClave(resultado.getString("CLAVE_DOC"));
                doc.setFolio(resultado.getString("FOLIO"));
                doc.setTipoDoc(resultado.getString("TIPO_DOC"));
                doc.setRuta(resultado.getString("RUTA"));
                doc.setDescripcion(resultado.getString("DESCRIPCION"));
                doc.setLugarFisico(resultado.getString("LUGAR_FISICO"));
                doc.setHistorico(Historicos.instancia().obtenerPorId(resultado.getInt("ID_HISTORICO")));
                doc.setSeccion(Secciones.instancia().obtenerPorId(resultado.getInt("ID_SECCION")));
                if (resultado.getString("PRECEDENTE") != null) {
                    doc.setPrecedente(Documentos.instancia().obtenerPorId(resultado.getString("PRECEDENTE")));
                }
                resultados.add(doc);
            }
        } catch (SQLException ex) {
            throw new DAOException("1 DODS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 DODS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Documento> selectAll() throws DAOException {
        query = "SELECT * FROM SSMA_DOCUMENTOS_T "
                + " WHERE ID_HISTORICO NOT IN "
                + " (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        return select();
    }

    public List<Documento> selectWhere(String condition) throws DAOException {
        query = "SELECT * FROM SSMA_DOCUMENTOS_T WHERE (" + condition + ")";
        query += " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
        return select();
    }

    public synchronized int selectCount(Integer seccion) throws DAOException {
        PreparedStatement sentencia = null;
        Connection conexion = null;
        ResultSet resultado = null;
        int contador = 0;
        try {
            query = "SELECT COUNT(1) AS CUENTA FROM SSMA_DOCUMENTOS_T WHERE ID_SECCION = " + seccion
                    + " AND TIPO_DOC != 'CUMP' "
                    + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                contador = resultado.getInt("CUENTA");
            } else {
                contador = 0;
            }
        } catch (SQLException ex) {
            throw new DAOException("3 DODS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("4 DODS-SQL " + ex.getMessage());
            }
        }
        return contador;
    }

    public List<Documento> selectPag(int desde, int hasta, Integer seccion) throws DAOException {
        query = "SELECT * FROM ("
                + " SELECT ROW_NUMBER()"
                + " OVER(ORDER BY CLAVE_DOC) AS LINEA,"
                + " SDT.*"
                + " FROM SSMA_DOCUMENTOS_T SDT"
                + " WHERE ID_SECCION = " + seccion
                + " AND TIPO_DOC != 'CUMP' "
                + " AND ID_HISTORICO NOT IN (SELECT ID_HISTORICO FROM SSMA_HISTORICO_T WHERE ESTADO = 'IN')"
                + ") A"
                + " WHERE A.LINEA BETWEEN " + desde
                + " AND " + hasta;
        return this.select();

    }

    public synchronized String selectNextFolio(String tipoDoc, Integer area) throws DAOException {
        Connection conexion = null;
        CallableStatement sentencia = null;
        ResultSet resultado = null;
        String folio = "";
        try {
            query = "{call SSMA_PROX_FOLIO_P('" + tipoDoc.trim() + "'," + area + ")}";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareCall(query);
            sentencia.execute();
            resultado = sentencia.getResultSet();
            resultado.next();
            folio = resultado.getString("FOLIO");
        } catch (SQLException ex) {
            throw new DAOException("5 DODS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("6 DODS-SQL " + ex.getMessage());
            }
        }
        return folio;
    }
}